package com.china08.yxyapi.util.algorithm;

import java.util.ArrayList;
import java.util.List;

/**
 * 报告数据计算算法
 * 
 */
public class ReportAlgorithm {

    /**
     * 试题难度值 di = 1 - xi / a i（第i题题目难度 = 1 - 成绩均值 / 满分值）
     * 
     * @param scoreLst
     *            分数集合
     * @param fullMarks
     *            满分分数
     * @return
     */
    public static double difficultyValue(List<Double> scoreLst, double fullMarks) {
        double count = 0d;
        for (Double score : scoreLst) {
            count += score;
        }
        if (scoreLst.size() == 0) { return 0d; }
        return count / scoreLst.size() / fullMarks;
    }

    /**
     * 波动度 σ²=∑(X-μ) ^2/ N （波动值 = [（ 学生1得分 - 本题平均分 ）² + ……+（ 学生N得分 - 本题平均分 ）²] /
     * 总人次）
     * 
     * @param scoreLst
     *            分数集合
     * @return
     */
    public static double volatilityValue(List<Double> scoreLst) {
        double count = 0d, avg = 0d, results = 0d;
        for (Double score : scoreLst) {
            count += score;
        }
        if (scoreLst.size() == 0) { return 0d; }
        avg = count / scoreLst.size();
        for (Double score : scoreLst) {
            results += Math.pow((score - avg), 2);
        }
        return results / scoreLst.size();
    }

    /**
     * 正确率 `X = ∑ Xi / s （得分率 = 分数和/总分）
     * 
     * @param scoreLst
     *            分数集合
     * @param fullMarks
     *            满分分数
     * @return
     */
    public static double correct(List<Double> scoreLst, double fullMarks) {
        double count = 0d;
        for (Double score : scoreLst) {
            count += score;
        }
        if (scoreLst.size() == 0) { return 0d; }
        return count / (scoreLst.size() * fullMarks);

    }

    /**
     * 公式：Gi = （Hi - Li） / ai（区分度 = （ 高分组同学第i题的平均成绩 - 中低分组同学第i题的平均成绩 ） / 满分值）
     * 
     * @param scoreLst
     *            分数集合
     * @param fullMarks
     *            满分分数
     * @return
     */
    public static double differentiationValue(List<Double> scoreLst, double fullMarks) {
        if (scoreLst.size() == 0) { return 0d; }
        List<Double> hiScoreLst = new ArrayList<Double>();
        List<Double> liScoreLst = new ArrayList<Double>();
        // 分数从低到高
        scoreLst.sort((h1, h2) -> h2.compareTo(h1));
        hiScoreLst.addAll(scoreLst);
        // 分数从高到低
        scoreLst.sort((h1, h2) -> h1.compareTo(h2));
        liScoreLst.addAll(scoreLst);
        int hiHum = (int) Math.ceil((scoreLst.size() * 0.1));
        int liHum = scoreLst.size() - hiHum;
        double andHi = 0d;
        for (int i = 0; i < hiHum; i++) {
            andHi += hiScoreLst.get(i);
        }
        double avgHi = andHi / hiHum;
        double andLi = 0d;
        for (int i = 0; i < liHum; i++) {
            andLi += liScoreLst.get(i);
        }
        double avgLi = liHum == 0 ? 0d : andLi / liHum;
        if (fullMarks == 0) { return 0d; }
        return (avgHi - avgLi) / fullMarks;
    }
}
